Unity[MonoBehavior]SetActive和enabled的使用与MonoBehavior的关系

问题发现

GameObject勾选,Mesh Renderer不勾选的情况下,运行游戏,可在Start()中从自身获取到Materials中元素。之前以为无法通过脚本获取enabled=false的组件内容,重新看了一下生命周期的相关内容,记录一下。
20220923151740

MonoBehaviour的生命周期

周期图不在此复制了,网上有很多。Monobehaviour作为Unity的特殊组件,一个脚本继承的时候会自动调用很多方法,方法称为“事件函数”。

Awake()

  • 加载场景时会调用Awake
  • 初始化使用 Object.Instantiate 创建的 GameObject时会调用Awake
  • 在脚本实例的生存期内,只会调用一次,所以用于初始化,脚本的生存期持续到包含它的场景被卸载为止,如果重新加载场景,也会重新调用Awake
  • Unity 调用每个 GameObject 的 Awake 的顺序是不确定的,用 Awake 在脚本之间设置引用,并使用 /Start/(在所有 Awake 调用完成后调用)来回传递任何信息
  • 对于未激活的 GameObject,调用 GameObject.SetActive (GameObject为On)可以将其激活。

    Start()

  • 唤醒后执行一帧,与 Awake 不同的是,它在一帧之后执行。
  • 在脚本生命周期内仅调用一次
  • GameObject 和 MonoBehaviour 都在 ON 状态下运行(活动)

    OnEnable()

    与 Awake 和 Start 一样,它用于初始化。但是,与 Awake 和 Start 不同的是,它被多次调用是一个很大的功能。
  • 在 GameObject 和 MonoBehaviour 都打开的情况下运行
  • 唤醒后运行(Start前)
  • 运行多次,在对象变为启用和激活状态时调用。

    OnDisable()

    OnEnable 的反向。关闭时调用。
  • 当 GameObject 或 MonoBehaviour 关闭时工作
  • 即使组件被移除也能工作

    Update()

  • 运行每一帧
  • 在 GameObject 和 MonoBehaviour 都打开的情况下运行

    OnDestory()

  • 场景或游戏结束时,发生 OnDestroy
  • 删除 GameObject 或 MonoBehaviour执行
  • 如果您过去没有运行 Awake,则不起作用。如果 GameObject 仍处于非活动状态,则 OnDestroy 将不起作用。

选择SetActive or enabled

AwakeStartOnEnableUpdate执行的条件是GameObject或Component处于活动状态,活动状态如下图所示
20220923164817

GameObject(SetActive)和Component(enabled)的6种切换模式

  1. GameObject[SetActive(false)] Component[enabled=false]
    20220923165529

执行事件函数:无
2. GameObject[SetActive(true)] Component[enabled=false]
20220923165632
执行事件函数:Awake()
3. GameObject[SetActive(false)] Component[enabled=true]
20220923165807
执行事件函数:无
4. GameObject[SetActive(true)] Component[enabled=true]
20220923165857
执行事件函数:Awake()、OnEnable()、Start()、Update()

除非GameObject被打开,否则什么都不会起作用

  1. GameObject[SetActive(true)] Component[enabled=false],再GameObject[SetActive(true)] Component[enabled=true]
    20220923170415

状态发生变化时执行事件函数:OnEnable()、Start()、Update(),未执行Awake()
6. 保持Component状态不变,使GameObject默认开启,然后关闭再打开
20220923171436
状态发生变化时执行事件函数:OnEnable()、Update(),未执行Awake()、Start()

Awake()、Start()每个GameObject只能调用一次

总结

Component的活动状态(enable)ON / OFF影响的是特定的事件函数,如果为 OFF 仅为不自动执行这些周期事件函数,所以不会影响到取其中的字段内容。

参考

https://shibuya24.info/entry/unity-active#%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E2%91%A0GameObject:OFF|%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88:OFF


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!